/**
 * @author ZhangHuihua@msn.com
 */
(function($){
    var _op = {
        cursor: 'move', // selector 的鼠标手势
        sortBoxs: 'div.sortDrag', //拖动排序项父容器
        replace: false, //2个sortBox之间拖动替换
        items: '> *', //拖动排序项选择器
        selector: '', //拖动排序项用于拖动的子元素的选择器，为空时等于item
        zIndex: 1000
    };
    var sortDrag = {
        start:function($sortBox, $item, event, op){
            var $placeholder = this._createPlaceholder($item);
            var $helper = $item.clone();
            var position = $item.position();
            $helper.data('$sortBox', $sortBox).data('op', op).data('$item', $item).data('$placeholder', $placeholder);
            $helper.addClass('sortDragHelper').css({position:'absolute',top:position.top+$sortBox.scrollTop(),left:position.left,zIndex:op.zIndex,width:$item.width()+'px',height:$item.height()+'px'}).jDrag({
                selector:op.selector,
                drag:this.drag,
                stop:this.stop,
                event:event
            });

            $item.before($placeholder).before($helper).hide();
            return false;
        },
        drag:function(el, event){
            var $helper = $(arguments[0]), $sortBox = $helper.data('$sortBox'), $placeholder = $helper.data('$placeholder');
            var $items = $sortBox.find($helper.data('op')['items']).filter(':visible').filter(':not(.sortDragPlaceholder, .sortDragHelper)');
            var helperPos = $helper.position(), firstPos = $items.eq(0).position();

            var $overBox = sortDrag._getOverSortBox($helper, event);
            if ($overBox.length > 0 && $overBox[0] != $sortBox[0]){ //移动到其他容器
                $placeholder.appendTo($overBox);
                $helper.data('$sortBox', $overBox);
            } else {
                for (var i=0; i<$items.length; i++) {
                    var $this = $items.eq(i), position = $this.position();
        
                    if (helperPos.top > position.top + 10) {
                        $this.after($placeholder);
                    } else if (helperPos.top <= position.top) {
                        $this.before($placeholder);
                        break;
                    }
                }
            }
        },
        stop:function(){
            var $helper = $(arguments[0]), $sortBox = $helper.data('$sortBox'), $item = $helper.data('$item'), $placeholder = $helper.data('$placeholder');

            var position = $placeholder.position();
            $helper.animate({
                    top: (position.top+$sortBox.scrollTop()) + "px",
                    left: position.left + "px"
                }, 
                {
                complete: function(){
                    if ($helper.data('op')['replace']){ //2个sortBox之间替换处理
                        $srcBox = $item.parents(_op.sortBoxs+":first");
                        $destBox = $placeholder.parents(_op.sortBoxs+":first");
                        if ($srcBox[0] != $destBox[0]) { //判断是否移动到其他容器中
                            $replaceItem = $placeholder.next();
                            if ($replaceItem.size() > 0) {
                                $replaceItem.insertAfter($item);
                            }
                        }
                    }
                    $item.insertAfter($placeholder).show();
                    $placeholder.remove();
                    $helper.remove();
                },
                duration: 300
            });
        },
        _createPlaceholder:function($item){
            return $('<'+$item[0].nodeName+' class="sortDragPlaceholder"/>').css({
                width:$item.outerWidth()+'px',
                height:$item.outerHeight()+'px',
                marginTop:$item.css('marginTop'),
                marginRight:$item.css('marginRight'),
                marginBottom:$item.css('marginBottom'),
                marginLeft:$item.css('marginLeft')
            });
        },
        _getOverSortBox:function($item, e){
            var itemPos = $item.position();
            var y = itemPos.top+($item.height()/2), x = itemPos.left+($item.width()/2);
            return $(_op.sortBoxs).filter(':visible').filter(function(){
                var $sortBox = $(this), sortBoxPos = $sortBox.position(),
                    sortBoxH = $sortBox.height(), sortBoxW = $sortBox.width();
                return DWZ.isOver(y, x, sortBoxPos.top, sortBoxPos.left, sortBoxH, sortBoxW);
            });
        }
    };
    
    $.fn.sortDrag = function(options){
                
        return this.each(function(){
            var op = $.extend({}, _op, options);
            var $sortBox = $(this);
            
            if ($sortBox.attr('selector')) op.selector = $sortBox.attr('selector');
            $sortBox.find(op.items).each(function(i){
                var $item = $(this), $selector = $item;
                if (op.selector) {
                    $selector = $item.find(op.selector).css({cursor:op.cursor});
                }

                $selector.mousedown(function(event){
                    sortDrag.start($sortBox, $item, event, op);
    
                    event.preventDefault();
                });
            });
            
        });
    }
})(jQuery);
